#!/bin/sh
# Git Clone Helper with Progress Notifications
# 特性：克隆过程中显示持续通知，成功时显示"OK"通知

# 配置项
HISTORY_FILE="$HOME/.clipboard-history"
MAX_ENTRIES=100
GIT_DOMAINS="gitee.com|github.com|codeberg.org"
GIT_REGEX="((http|https|git)://|git@)($GIT_DOMAINS)[/:][a-zA-Z0-9._-]+/[a-zA-Z0-9._-]+"
DEFAULT_CLONE_DIR="$HOME/Downloads"
CUSTOM_CLONE_DIR="$HOME/code"
FINAL_NOTIFICATION_TIMEOUT=3  # 结果通知显示时间（秒）

# 发送普通通知（会自动消失）
send_notification() {
    local title="$1"
    local message="$2"
    local icon="$3"
    notify-send -u normal -t $((FINAL_NOTIFICATION_TIMEOUT * 1000)) -i "$icon" "$title" "$message" &
}

# 发送持续通知（不会自动消失，需手动关闭或被后续通知替换）
send_progress_notification() {
    local title="$1"
    local message="$2"
    local icon="$3"
    # -t 0 表示永不超时，-u critical 提高优先级确保显示
    # notify-send -u critical -t 0 -i "$icon" "$title" "$message" &
    # TODO: timeout 30s
    notify-send -u critical -t 30000 -i "$icon" "$title" "$message" &
    # 记录通知进程ID，方便后续可能需要的终止操作
    PROGRESS_NOTIFY_PID=$!
}

# 确保历史文件存在
[ -f "$HISTORY_FILE" ] || touch "$HISTORY_FILE"

# 添加剪贴板中的有效Git地址到历史（去重）
add_to_history() {
    local current
    current=$(xclip -selection clipboard -o 2>/dev/null) || return
    [ -z "$current" ] && return

    # 清理URL格式
    current=$(echo "$current" | sed -e '/^\n*$/d' -e 's/^.*http/http/' -e 's/^.*git@/git@/' | tr -d '\0')
    
    # 验证URL
    echo "$current" | grep -qE "$GIT_REGEX" || return

    # 去重
    if ! grep -qxF "$current" "$HISTORY_FILE"; then
        echo "$current" >> "$HISTORY_FILE"
        tail -n "$MAX_ENTRIES" "$HISTORY_FILE" > "$HISTORY_FILE.tmp"
        mv "$HISTORY_FILE.tmp" "$HISTORY_FILE"
    fi
}

# dmenu选择（按ESC直接退出）
dmenu_select() {
    local prompt="$1"
    local items="$2"
    local lines="$3"
    local result

    result=$(echo "$items" | dmenu -c -fn monospace:size=24 -i -p "$prompt" -l "$lines")
    
    # 按ESC退出（无通知）
    if [ -z "$result" ]; then
        exit 0
    fi

    echo "$result"
}

# 从历史选择Git URL
select_git_url() {
    local git_entries
    git_entries=$(grep -E "$GIT_REGEX" "$HISTORY_FILE" | sort -u)

    if [ -z "$git_entries" ]; then
        send_notification "无历史记录" "未找到Git仓库地址" "warning"
        exit 1
    fi

    local domains=$(echo "$GIT_DOMAINS" | sed 's/|/ /g')
    dmenu_select "选择Git仓库:" "$git_entries" 15 | 
        sed -e 's/^.*http/http/' -e 's/^.*git@/git@/'
}

# 选择克隆目录
choose_clone_dir() {
    local items="默认目录 ($DEFAULT_CLONE_DIR)
自定义目录 ($CUSTOM_CLONE_DIR)"
    local choice=$(dmenu_select "选择克隆目录:" "$items" 2)
    echo "$choice" | grep -q "自定义目录" && echo "$CUSTOM_CLONE_DIR" || echo "$DEFAULT_CLONE_DIR"
}

# 输入仓库名称
input_repo_name() {
    local default="$1"
    dmenu_select "输入目录名称 (默认: $default):" "$default" 1
}

# 主克隆逻辑（带进度通知）
process_clone() {
    local url="$1"
    local clone_dir=$(choose_clone_dir)
    local repo_name=$(input_repo_name "$(basename "$url" .git)")
    local target="$clone_dir/$repo_name"

    # 检查目录是否存在
    if [ -d "$target" ]; then
        send_notification "克隆失败" "目录已存在:\n$target" "error"
        exit 1
    fi

    # 创建目录
    if ! mkdir -p "$clone_dir"; then
        send_notification "克隆失败" "无法创建目录:\n$clone_dir" "error"
        exit 1
    fi

    # 确认命令
    local cmd="git clone --depth=1 \"$url\" \"$target\""
    local confirm=$(dmenu_select "执行? $cmd" "是\n否" 2)

    if [ "$confirm" != "是" ]; then
        send_notification "已取消" "克隆操作已取消" "info"
        exit 0
    fi

    # 显示克隆进度通知（不自动消失）
    send_progress_notification "正在克隆" "仓库: $(basename "$url" .git)\n请等待..." "sync"

    # 执行克隆并捕获输出
    if eval "$cmd"; then
        # 克隆成功：通知标题改为"OK"，明确表示成功
        send_notification "OK" "仓库路径:\n$target\n(已复制到剪贴板)" "checkbox-checked"
        echo "$target" | xclip -selection clipboard
    else
        # 克隆失败：保持原有错误通知
        send_notification "克隆失败" "命令执行错误:\n$cmd" "error"
        exit 1
    fi

    # 终止进度通知进程（如果仍在运行）
    if [ -n "$PROGRESS_NOTIFY_PID" ]; then
        pkill -P "$PROGRESS_NOTIFY_PID" 2>/dev/null
    fi
}

# 依赖检查
check_deps() {
    local deps="dmenu xclip notify-send git sed grep tail"
    for dep in $deps; do
        if ! command -v "$dep" >/dev/null 2>&1; then
            if command -v notify-send >/dev/null 2>&1; then
                notify-send -u critical -t 5000 "缺少依赖工具" "$dep 未安装，请先安装"
            else
                echo "错误：缺少依赖工具 $dep，请先安装" >&2
            fi
            exit 1
        fi
    done
}

# 主流程
check_deps
add_to_history
selected_url=$(select_git_url)
process_clone "$selected_url"

# 保持脚本运行，确保结果通知可见
sleep $FINAL_NOTIFICATION_TIMEOUT
